﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using ThanNhanTao.Server;
using DevExpress.Xpf.Core;
using System.ComponentModel;
using DevExpress.Xpf.Grid;
using ThanNhanTao.Server.BLL;
using DevExpress.XtraEditors.DXErrorProvider;
using ThanNhanTao.Report;
using ThanNhanTao.Server.Entities;
using System.Data;
using System.Linq;
using ThanNhanTao.ListTemp;
using ThanNhanTao.Server.Enum;
using ThanNhanTao.CommonControl;

namespace ThanNhanTao
{
    /// <summary>
    /// Interaction logic for frmThanhToanNgoaiTruTheoThang.xaml
    /// </summary>
    public partial class frmThanhToanNoiTru : DXWindow
    {
        #region Fields

        private BenhNhan benhNhan;
        public bool? isDialogShowed;
        ChiDinhBLL chiDinhBll = new ChiDinhBLL();
        Dm_YeuCauBLL dmYeuCauBll = new Dm_YeuCauBLL();
        Dm_LoaiYeuCauBLL dmLoaiYeuCauBll = new Dm_LoaiYeuCauBLL();
        List<Dm_YeuCau> listDmYeuCau;
        BindingList<ChiDinh> listChiDinh;
        List<int> listIdChiDinhXoa;
        string validationError;

        #endregion

        public frmThanhToanNoiTru(BenhNhan benhNhan)
        {
            InitializeComponent();
            listDmYeuCau = new List<Dm_YeuCau>();
            listChiDinh = new BindingList<ChiDinh>();
            listIdChiDinhXoa = new List<int>();
            this.benhNhan = benhNhan;
            if(benhNhan == null)
            {
                DXMessageBox.Show("Không tìm thấy thông tin bệnh nhân", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Warning);
                this.Close();
                return;
            }

            try
            {
                LoadForm();
            }
            catch (Exception)
            {
                DXMessageBox.Show("Thiết lập thông tin phiếu thanh toán không thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
            }
            
        }

        public void LoadForm()
        {
            lblThongTinBN.Content = string.Format("Bệnh nhân: {0}"
                                            , benhNhan.Ho + " " + benhNhan.Ten);
            deNgayThanhToan.Validate -= new DevExpress.Xpf.Editors.Validation.ValidateEventHandler(deNgayThanhToan_Validate);
            deNgayThanhToan.EditValue =ThanNhanTaoGlobal.NgayLamViec; //DateTime.Now;
            deNgayThanhToan.Validate += new DevExpress.Xpf.Editors.Validation.ValidateEventHandler(deNgayThanhToan_Validate);
            ThietLapTuNgayDenNgay();
            BindGridChiDinh();
        }

        public void BindGridChiDinh()
        {
            listIdChiDinhXoa.Clear();
            listChiDinh.Clear();
            foreach (var item in chiDinhBll.RetrieveChiDinhNoiTru(benhNhan.IdBenhNhan
                                            , Convert.ToDateTime(deTuNgay.EditValue)
                                            , Convert.ToDateTime(deDenNgay.EditValue)))
            {
                if (item.Dm_YeuCau.MaLoaiYeuCau != EnumMaLoaiYeuCau.ThuocDichTruyen)
                    item.TenYeuCau = String.Format("{0}/{1}  {2}", item.NgayYeuCau.Day, item.NgayYeuCau.Month, item.Dm_YeuCau.TenYeuCau);
                else
                    item.TenYeuCau = item.Dm_YeuCau.TenYeuCau;
                item.TenDonViTinh = item.Dm_DonViTinh.TenDonViTinh;
                item.TenLoaiYeuCau = item.Dm_YeuCau.Dm_LoaiYeuCau.TenLoaiYeuCau;
                listChiDinh.Add(item);
            }
            gridChiDinh.ItemsSource = listChiDinh;
            SetEnableButton(false, false, listChiDinh.Count > 0);
        }

        #region Events

        private void btnLuu_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                btnLuu.Focus();
                deNgayThanhToan.DoValidate();
                if (deNgayThanhToan.HasValidationError)
                    return;
                if (!string.IsNullOrEmpty(validationError))
                {
                    DXMessageBox.Show(validationError, "Thông báo", MessageBoxButton.OK, MessageBoxImage.Warning);
                    return;
                }
                List<DateTime> listNgayXoa = ThanNhanTaoGlobal.ListNgayXoa;
                chiDinhBll.SaveChiDinhNoiTru(listIdChiDinhXoa, listChiDinh.ToList(), Convert.ToDateTime(deNgayThanhToan.EditValue), ref listNgayXoa);
                DXMessageBox.Show("Lưu thông tin thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Information);
                ThanNhanTaoGlobal.ListNgayXoa = listNgayXoa; //lưu thành công thì trả về danh sách chạy thận cần xóa theo ngày
                ThanNhanTaoGlobal.IdBenhNhanXoa = this.benhNhan.IdBenhNhan;
                BindGridChiDinh();
            }
            catch (Exception)
            {
                DXMessageBox.Show("Lưu thông tin không thành công","Thông báo",MessageBoxButton.OK,MessageBoxImage.Error);
            }
            
        }

        private void btninPhieu_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                DateTime? ngaydenKham = null;
                DateTime? ngayKetThuc = null;
                int tongSoNgayDieuTri;
                List<Dm_LoaiYeuCau> listLoaiYeuCau = dmLoaiYeuCauBll.RetrieveAllDmLoaiYeuCauNoiTru();
                List<PhieuThanhToanNoiTruEntities> dtThanhToan = chiDinhBll.InPhieuPhieuThanhToanNoiTru(benhNhan.IdBenhNhan
                                                                                                            , Convert.ToDateTime(deTuNgay.EditValue)
                                                                                                            , Convert.ToDateTime(deDenNgay.EditValue)
                                                                                                            , out ngaydenKham
                                                                                                            , out ngayKetThuc
                                                                                                            , out tongSoNgayDieuTri);

                //Lấy danh sách chỉ định theo nhóm cần hiển thị
                List<ListLoaiYeuCauGroup> listLoaiYeuCauGroup = (from enti in dtThanhToan
                                                                 group enti by new
                                                                 {
                                                                     enti.MaLoaiYeuCau,
                                                                     enti.TenLoaiYeuCau
                                                                 } into entiGroup
                                                                 select new ListLoaiYeuCauGroup
                                                                 {
                                                                     MaLoaiYeuCau = entiGroup.Key.MaLoaiYeuCau,
                                                                     TenLoaiYeuCau = entiGroup.Key.TenLoaiYeuCau,
                                                                     CongThanhTien = entiGroup.Sum(u => u.ThanhTien).GetValueOrDefault(0),
                                                                     CongSoLuong = entiGroup.Sum(u => u.SoLuong).GetValueOrDefault(0),
                                                                 }).ToList();

                //Thiết lập kết nối nhóm từ DB Left Join với dữ liệu lấy từ DB
                List<ListLoaiYeuCauGroup> listLoaiYeuCauGroupLeft = (from a in listLoaiYeuCau
                                                                     join b in listLoaiYeuCauGroup on a.MaLoaiYeuCau equals b.MaLoaiYeuCau into bl
                                                                     from blr in bl.DefaultIfEmpty()
                                                                     orderby a.STT ascending
                                                                     select new ListLoaiYeuCauGroup
                                                                     {
                                                                         MaLoaiYeuCau = a.MaLoaiYeuCau,
                                                                         TenLoaiYeuCau = a.TenLoaiYeuCau,
                                                                         CongThanhTien = blr != null ? blr.CongThanhTien : 0,
                                                                         CongSoLuong = blr != null ? blr.CongSoLuong : 0,
                                                                         SoDongInPhieu = a.SoDongInPhieu
                                                                     }).ToList();




                decimal tongCongThanhTien = listLoaiYeuCauGroup.Sum(u => u.CongThanhTien);
                int tongSoDongInPhieu = listLoaiYeuCauGroupLeft.Sum(u => u.SoDongInPhieu);
                int tongSoDongKhongInPhieu = dmLoaiYeuCauBll.SoLoaiYeuCauKhongInNoiTru();
                int soDongTrong = 31 + (tongSoDongKhongInPhieu * 2) - dtThanhToan.Count - tongSoDongInPhieu;
                int soDongThemTrongDanhMucThuoc = 0;
                int soDongThemNgoaiDanhMucThuoc = 0;
                if (soDongTrong > 0)
                {
                    soDongThemTrongDanhMucThuoc = soDongTrong; //(soDongTrong / 2) + (soDongTrong % 2);
                    //soDongThemNgoaiDanhMucThuoc = soDongTrong - soDongThemTrongDanhMucThuoc;
                }
                //Bind thông tin lên report
                rptPhieuThanhToanNgoaiTruTheoThangMain rpt = new rptPhieuThanhToanNgoaiTruTheoThangMain(dtThanhToan, soDongThemTrongDanhMucThuoc, soDongThemNgoaiDanhMucThuoc);
                rpt.DataSource = listLoaiYeuCauGroupLeft;
                rpt.BindReportHeader(benhNhan, ngaydenKham, ngayKetThuc, tongSoNgayDieuTri); //bind report header
                DateTime? ngayThanhToan = null;
                if (ngayKetThuc.HasValue)
                    ngayThanhToan = new DateTime(ngayKetThuc.Value.Year,ngayKetThuc.Value.Month + 1,1).AddDays(-1);
                rpt.BindReportFooter(ngayThanhToan);
                rpt.BindDetail(); //bind detail
                rpt.BindGroupFooter(tongCongThanhTien, 0, 0, 0, dtThanhToan.Count); //bind group footer
                ReportCommonWindow windowReport = new ReportCommonWindow(rpt);
                windowReport.Title = "Phiếu in nội trú";
                windowReport.ShowDialog();
            }
            catch (Exception)
            {
                DXMessageBox.Show("In phiếu không thành công","Thông báo",MessageBoxButton.OK,MessageBoxImage.Error);
            }
        }

        private void btnDong_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }

        private void btnXoa_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                ChiDinh chiDinhXoa = gridChiDinh.GetFocusedRow() as ChiDinh;
                if (chiDinhXoa != null && tbvChiDinh.FocusedRowHandle != GridControl.NewItemRowHandle)
                {
                    if (chiDinhXoa.IdChiDinh != 0)
                        listIdChiDinhXoa.Add(chiDinhXoa.IdChiDinh);
                    listChiDinh.Remove(chiDinhXoa);
                    if (listChiDinh.Count == 0)
                        SetEnableButton(true, true, false);
                    else
                        SetEnableButton(true, true, true);
                }
            }
            catch (Exception)
            {
                DXMessageBox.Show("Xóa chi tiết không thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        private void btnHuyBo_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                BindGridChiDinh();
            }
            catch (Exception)
            {
                DXMessageBox.Show("Hủy bỏ phiếu thanh toán không thành công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
            }
            
        }

        private void tbvChiDinh_PreviewKeyDown(object sender, KeyEventArgs e)
        {
            try
            {
                int rowHandle = tbvChiDinh.FocusedRowHandle;
                SetEnableButton(true, true, true);
                if (e.Key == Key.Enter)
                {
                    int colIndex = gridChiDinh.Columns.IndexOf(tbvChiDinh.FocusedColumn);
                    if ((gridChiDinh.Columns[colIndex].FieldName == "MaYeuCau")
                        && (colMaYeuCau.ReadOnly == false) && e.OriginalSource is TextBox)
                    {
                        // Khởi tạo Tìm kiếm PTTT
                        TextBox textBoxMaYeuCau = (TextBox)e.OriginalSource;
                        frmThanhToanNgoaiTruTimKiem timKiem = new frmThanhToanNgoaiTruTimKiem();
                        timKiem.WindowStartupLocation = WindowStartupLocation.CenterScreen;
                        timKiem.Title = "Chỉ định nội trú";
                        ThemeManager.SetThemeName(timKiem, "Office2007Blue");
                        //Lấy dữ liệu từ danh mục yêu cầu
                        if (listDmYeuCau.Count == 0)
                            listDmYeuCau = dmYeuCauBll.RetrieveAllDmYeuCauNoiTru();
                        timKiem.SearchDmYeuCau(listDmYeuCau, listChiDinh.ToList(), textBoxMaYeuCau.Text, null, 0);
                        if (timKiem.rowCount > 1)
                            isDialogShowed = timKiem.ShowDialog();

                        //Xóa thông tin trên dòng mới
                        tbvChiDinh.CancelRowEdit();
                        //if (rowHandle < 0)
                        //    tbvChiDinh.DeleteRow(rowHandle);
                        if (timKiem.laChapNhan) //Nếu trên form tìm kiếm yêu cầu bấm nút OK
                        {
                            foreach (var item in timKiem.ListYeuCauChon)
                            {
                                ChiDinh chiDinh = new ChiDinh
                                {
                                    MaYeuCau = item.MaYeuCau,
                                    GiaYeuCau = item.GiaYeuCau,
                                    SoLuong = 1,
                                    LaChayThan = item.LaChayThan,
                                    NgayYeuCau = Convert.ToDateTime(deNgayThanhToan.EditValue),
                                    MaDonViTinh = item.MaDonViTinh,
                                    PhanLoaiBHYT = item.PhanLoaiBHYT,
                                    ChoNoiTru = false
                                };
                                chiDinh.IdBenhNhan = benhNhan.IdBenhNhan;
                                chiDinh.TenYeuCau = item.TenYeuCau;
                                chiDinh.TenDonViTinh = item.Dm_DonViTinh.TenDonViTinh;
                                chiDinh.TenLoaiYeuCau = item.Dm_LoaiYeuCau.TenLoaiYeuCau;
                                listChiDinh.Add(chiDinh);
                            }
                        }
                    }
                    else if ((gridChiDinh.Columns[colIndex].FieldName == "SoLuong")
                        && (colMaYeuCau.ReadOnly == false) && e.OriginalSource is TextBox)
                    {
                        if (rowHandle >= 0)
                        {
                            tbvChiDinh.FocusedColumn = colThanhTien;
                            tbvChiDinh.FocusedRowHandle = rowHandle + 1;
                            tbvChiDinh.FocusedColumn = colSoluong;
                        }
                        else
                            tbvChiDinh.FocusedColumn = colThanhTien;
                    }
                }
                else if (e.Key == Key.Escape)
                {
                    tbvChiDinh.CancelRowEdit();
                    if (rowHandle < 0)
                        tbvChiDinh.DeleteRow(rowHandle);
                }
            }
            catch (Exception)
            {
                DXMessageBox.Show("Thiết lập danh sách chỉ định không thanh công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
            }
           
        }

        private void tbvChiDinh_FocusedRowChanged(object sender, DevExpress.Xpf.Grid.FocusedRowChangedEventArgs e)
        {
            ChiDinh chiDinh = e.NewRow as ChiDinh;
            if (chiDinh != null)
            {
                if (!string.IsNullOrEmpty(chiDinh.MaYeuCau))
                {
                    colMaYeuCau.ReadOnly = true;
                }
            }
            else
                colMaYeuCau.ReadOnly = false;
        }

        private void tbvChiDinh_ValidateRow(object sender, DevExpress.Xpf.Grid.GridRowValidationEventArgs e)
        {
            if (e.RowHandle == GridControl.NewItemRowHandle)
                e.IsValid = false;
            else
                e.IsValid = true;
        }

        private void tbvChiDinh_InvalidRowException(object sender, DevExpress.Xpf.Grid.InvalidRowExceptionEventArgs e)
        {
            e.ExceptionMode = DevExpress.Xpf.Grid.ExceptionMode.NoAction;
        }

        private void colSoluong_Validate(object sender, GridCellValidationEventArgs e)
        {
            validationError = string.Empty;
            if (e.Value == null)
            {
                validationError = "Số lượng không hợp lệ";
                e.IsValid = false;
                e.SetError(validationError, ErrorType.Warning);
            }
            else
            {
                if (Convert.ToInt32(e.Value) <= 0)
                {
                    validationError = "Số lượng không hợp lệ";
                    e.IsValid = false;
                    e.SetError(validationError, ErrorType.Warning);
                }
                else
                    e.IsValid = true;
            }
        }

        private void deNgayThanhToan_Validate(object sender, DevExpress.Xpf.Editors.ValidationEventArgs e)
        {
            if (!string.IsNullOrEmpty(deNgayThanhToan.DisplayText))
            {
                DateTime tuNgay = deTuNgay.DateTime;
                DateTime denNgay = deDenNgay.DateTime;
                DateTime ngayThanhToan = Convert.ToDateTime(e.Value);
                if (ngayThanhToan.Date < tuNgay.Date)
                {
                    e.IsValid = false;
                    e.SetError("Ngày thanh toán không được nhỏ hơn từ ngày", ErrorType.Critical);
                }
                else if (ngayThanhToan.Date > denNgay.Date)
                {
                    e.IsValid = false;
                    e.SetError("Ngày thanh toán không được lớn hơn đến ngày", ErrorType.Critical);
                }
                else
                    e.IsValid = true;
            }
            else
            {
                e.IsValid = false;
                e.SetError("Vui lòng nhập ngày thanh toán", ErrorType.Critical);
            }
        }

        private void deTuNgay_Validate(object sender, DevExpress.Xpf.Editors.ValidationEventArgs e)
        {
            if (!string.IsNullOrEmpty(deTuNgay.DisplayText))
            {
                //DateTime tuNgay = Convert.ToDateTime(e.Value);
                //DateTime denNgay = Convert.ToDateTime(deDenNgay.EditValue);
                //DateTime ngayThanhToan = Convert.ToDateTime(deNgayThanhToan.EditValue);
                //if (tuNgay.Date > denNgay.Date)
                //{
                //    e.IsValid = false;
                //    e.SetError("Từ ngày không được lớn hơn đến ngày",ErrorType.Critical);
                //}
                //else if (tuNgay.Date > ngayThanhToan.Date)
                //{
                //    e.IsValid = false;
                //    e.SetError("Từ ngày không được lớn hơn ngày thanh toán", ErrorType.Critical);
                //}
                //else
                    e.IsValid = true;
            }
            else
            {
                e.IsValid = false;
                e.SetError("Vui lòng nhập từ ngày", ErrorType.Critical);
            }
        }

        private void deTuNgay_EditValueChanging(object sender, DevExpress.Xpf.Editors.EditValueChangingEventArgs e)
        {
            try
            {
                DateTime ngayDaThayDoi = Convert.ToDateTime(e.NewValue);
                DateTime ngayChuaThayDoi = Convert.ToDateTime(e.OldValue);
                if (e.NewValue != null && ngayDaThayDoi.Date != ngayChuaThayDoi.Date)
                {
                    BindGridChiDinh();
                }
            }
            catch (Exception)
            {
                DXMessageBox.Show("Thiết lập từ ngày không thanh công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }

        private void deDenNgay_Validate(object sender, DevExpress.Xpf.Editors.ValidationEventArgs e)
        {
            if (!string.IsNullOrEmpty(deDenNgay.DisplayText))
            {
                //DateTime tuNgay = Convert.ToDateTime(deTuNgay.EditValue);
                //DateTime denNgay = Convert.ToDateTime(e.Value);
                //DateTime ngayThanhToan = Convert.ToDateTime(deNgayThanhToan.EditValue);
                //if (tuNgay.Date > denNgay.Date)
                //{
                //    e.IsValid = false;
                //    e.SetError("Đến ngày không được nhỏ hơn từ ngày", ErrorType.Critical);
                //}
                //else if (ngayThanhToan.Date > denNgay.Date)
                //{
                //    e.IsValid = false;
                //    e.SetError("Đến ngày không được nhỏ hơn ngày thanh toán", ErrorType.Critical);
                //}
                //else
                    e.IsValid = true;
            }
            else
            {
                e.IsValid = false;
                e.SetError("Vui lòng nhập đến ngày", ErrorType.Critical);
            }
        }

        private void deDenNgay_EditValueChanging(object sender, DevExpress.Xpf.Editors.EditValueChangingEventArgs e)
        {
            try
            {
                DateTime ngayDaThayDoi = Convert.ToDateTime(e.NewValue);
                DateTime ngayChuaThayDoi = Convert.ToDateTime(e.OldValue);
                if (e.NewValue != null && ngayDaThayDoi.Date != ngayChuaThayDoi.Date)
                {
                    BindGridChiDinh();
                }
            }
            catch (Exception)
            {
                DXMessageBox.Show("Thiết lập đến ngày không thanh công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }


        #endregion

        #region Method

        public void SetEnableButton(bool buttonLuu, bool buttonHuyBo, bool buttonXoa)
        {
            btnLuu.IsEnabled = buttonLuu;
            btnHuyBo.IsEnabled = buttonHuyBo;
            btnXoa.IsEnabled = buttonXoa;
        }

        public void ThietLapTuNgayDenNgay()
        {
            try
            {
                //bool daThayDoiTuNgayDenNgay = false;
                deTuNgay.EditValueChanging -= new DevExpress.Xpf.Editors.EditValueChangingEventHandler(deTuNgay_EditValueChanging);
                deTuNgay.Validate -= new DevExpress.Xpf.Editors.Validation.ValidateEventHandler(deTuNgay_Validate);
                deDenNgay.EditValueChanging -= new DevExpress.Xpf.Editors.EditValueChangingEventHandler(deDenNgay_EditValueChanging);
                deDenNgay.Validate -= new DevExpress.Xpf.Editors.Validation.ValidateEventHandler(deDenNgay_Validate);

                DateTime ngayThanhToan = Convert.ToDateTime(deNgayThanhToan.EditValue);
                DateTime tuNgay = new DateTime(ngayThanhToan.Year, ngayThanhToan.Month, 1);//Convert.ToDateTime(string.Format("01/{0}/{1}", ngayThanhToan.Month, ngayThanhToan.Year));
                DateTime denNgay = tuNgay.AddMonths(1).AddDays(-1);
                deTuNgay.EditValue = tuNgay;
                deDenNgay.EditValue = denNgay;
                //daThayDoiTuNgayDenNgay = true;
                BindGridChiDinh();

                deTuNgay.EditValueChanging += new DevExpress.Xpf.Editors.EditValueChangingEventHandler(deTuNgay_EditValueChanging);
                deTuNgay.Validate += new DevExpress.Xpf.Editors.Validation.ValidateEventHandler(deTuNgay_Validate);
                deDenNgay.EditValueChanging += new DevExpress.Xpf.Editors.EditValueChangingEventHandler(deDenNgay_EditValueChanging);
                deDenNgay.Validate += new DevExpress.Xpf.Editors.Validation.ValidateEventHandler(deDenNgay_Validate);
            }
            catch (Exception)
            {
                DXMessageBox.Show("Thiết lập từ ngày đến ngày không thanh công", "Thông báo", MessageBoxButton.OK, MessageBoxImage.Error);
            }
            
        }

        #endregion

        
        

    }
}
